<?php
namespace Api\Controller;
use Think\Controller;
use Common\Model\UserModel;
use Common\Model\UserTokenModel;

/**
 * 公共控制器方法，输出json、输出jsonp等方式均在此处定义
 * 
 * @author xiaoyutab<xiaoyutab@qq.com>
 * @adtime 2017-2-16 15:32:35
 * @version v1.0.0
 * @copyright (c) 2017, xiaoyutab
 */
class ApiController extends Controller {
    /**
     * 构造函数
     * 设置不自动布局
     */
    public function __construct() {
        parent::__construct();
        // 自定义Tag分类信息
        layout(FALSE);
        // 此处内容为复制的Admin下的BashController内容,如需改动请改动两处信息
        C('type_config.TagType',array(
            1 => '案例',// 案例的图片比例是16:9
            2 => '分类',// 无图片，无介绍内容
            3 => '品牌',// 品牌和产品图片是1:1
            4 => '产品',// 品牌和产品图片是1:1
            5 => '首页',// 首页图片要求是16:17，无介绍内容.图标【72x72】
            // 备注：首页的图片在file_link中file_order为99，ICON图标在file_link中的file_order为98
        ));
        C('type_config.ProjectStatus',array(
            99 => '正常上线',
            98 => '删除',
            97 => '保存草稿',
        ));
    }

    /**
     * 定义输出方式，该方式兼容JSONP格式
     * @param  string $code 要返回的代码，如果是数据的话需要在此处传入数组
     * @return void 
     * @echo   json         输出json格式字符串。如果是jsonp请求就输出jsonp格式字符串
     * 
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2017-2-16 15:36:01
     */
    public function returnCode($code = '') {
        $error_code = C('ERROR_CODE');
        if (empty($code) && $code == '' && is_string($code)) {
            $success = array(
                'code' => '1',
                'msg' => $error_code['1'],
                'time' => date('Y-m-d H:i:s'),
                'data' => array(),
            );
        } else if (is_array($code)) {
            $code = $this->return_array($code);
            $success = array(
                'code' => '0',
                'msg' => $error_code['0'],
                'time' => date('Y-m-d H:i:s'),
                'data' => $code,
            );
        } else if (is_object($code)) {
            $code = $this->return_array($code);
            $success = array(
                'code' => '0',
                'msg' => $error_code['0'],
                'time' => date('Y-m-d H:i:s'),
                'data' => $code,
            );
        } else {
            $success = array(
                'code' => $code,
                'msg' => $error_code[$code],
                'time' => date('Y-m-d H:i:s'),
                'data' => array(),
            );
        }
        // 设置json返回头信息
        header("Content-Type:application/Json");
        $success['code'] = intval($success['code']);
        empty($success['data']) && $success['data'] = (object)$success['data'];
        // 支持jsonp格式调用
        if(C('API_CONFIG.callback')){
            $callback = empty($_GET['jsoncallback'])?$_GET['callback']:$_GET['jsoncallback'];
            if (!empty($callback) && preg_match("/^[\w_]+$/", $_GET["callback"])) {
                die(htmlspecialchars($callback) . "(" . json_encode($success) . ')');
            } else if (!empty($callback) && $success['code'] == '0'){
                self::returnCode('1');
            }
        } else {
            if (!empty($callback)) {
                die(htmlspecialchars($callback) . "(" . json_encode($success) . ')');
            }
        }
        die(json_encode($success));
    }
    
    /**
     * 测试接口页面
     */
    public function indexAction(){
        $this->returnCode(array());
    }
    
    /**
     * 配置空操作,如果用户随意访问就返回错误数据
     * 
     * @return json
     * @author xiaoyutab<xiaoyutab@qq.com>
     * @version v1.0.0
     * @copyright (c) 2017, xiaoyutab
     * @adtime 2017-11-23 10:36:01
     */
    public function _empty(){
        $this->returnCode();
        exit;
    }
    
    /**
     * 检测用户token
     *      如果没传入则直接返回用户未登录的结果
     * @return string
     */
    public function check_token(){
        // $token为用户在header头中加入的权限认证标识
        $token = $_SERVER['HTTP_TOKEN'];
        if(empty($token)){
            return $this->returnCode('21');
        }
        $_token = new UserTokenModel();
        $uid = $_token->check_token($token);
        if(!$uid){
            return $this->returnCode('21');
        }
        $_user = new UserModel();
        $info = $_user->get_info($uid);
        foreach($info as $k => $v){
            if(is_null($v)){
                $info[$k] = '';
            }
        }
        return $info;
    }
    
    /**
     * 无限递归处理数组
     * 
     * @param type $arr
     * @return type
     */
    private function return_array($arr = array()){
        if(!is_array($arr)){ $arr = (array)$arr; }
        $return_data = array();
        foreach($arr as $k => $v){
            if(is_null($v)){
                $return_data[$k] = '';
            } else if(is_numeric($v)){
                $return_data[$k] = (string)$v;
            } else if(is_array($v)){
                $return_data[$k] = $this->return_array($v);
            } else {
                $return_data[$k] = str_replace(C('OLD_CONTENT'),C('NEW_CONTENT'),htmlspecialchars_decode($v));
            }
        }
        return $return_data;
    }
}
